package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ICompanySaleServerDAO;
import org.jsola.hr.dto.CompanySaleServerAddDTO;
import org.jsola.hr.dto.CompanySaleServerUpdateDTO;
import org.jsola.hr.entity.CompanySaleServerDO;
import org.jsola.hr.query.CompanySaleServerQuery;
import org.jsola.hr.vo.CompanySaleServerListVO;
import org.jsola.hr.vo.CompanySaleServerVO;
import org.jsola.user.core.TokenUser;

import java.util.List;


/**
 * 用工单位服务
 *
 * @author zhr
 */
public interface ICompanySaleServerService extends IService<ICompanySaleServerDAO, CompanySaleServerDO> {

    /**
     * 新增用工单位服务
     *
     * @param companySaleServerAddDTO 新增用工单位服务DTO
     * @param tokenUser               当前用户
     * @return 用工单位服务详情信息
     */
    CompanySaleServerVO save(CompanySaleServerAddDTO companySaleServerAddDTO, TokenUser tokenUser);

    /**
     * 修改用工单位服务
     *
     * @param companySaleServerUpdateDTO 修改用工单位服务DTO
     * @param tokenUser                  当前用户
     * @return 更新数量
     */
    int update(CompanySaleServerUpdateDTO companySaleServerUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除用工单位服务，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser            当前用户
     * @param companySaleServerIds 用工单位服务id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... companySaleServerIds);

    /**
     * 根据用工单位服务id查找
     *
     * @param companySaleServerId 用工单位服务id
     * @param siteId              所属站点id
     * @return 用工单位服务详情信息
     */
    CompanySaleServerVO selectById(String companySaleServerId, String siteId);

    /**
     * 查询用工单位服务
     *
     * @param companySaleServerQuery 查询条件
     * @param siteId                 所属站点id
     * @return 用工单位服务列表信息
     */
    List<CompanySaleServerListVO> select(CompanySaleServerQuery companySaleServerQuery, String siteId);

    /**
     * 查询用工单位服务记录数
     *
     * @param companySaleServerQuery 查询条件
     * @param siteId                 所属站点id
     * @return 用工单位服务记录数
     */
    int selectCount(CompanySaleServerQuery companySaleServerQuery, String siteId);

    /**
     * 分页查询用工单位服务
     *
     * @param companySaleServerQuery 查询条件
     * @param siteId                 所属站点id
     * @return 用工单位服务列表信息
     */
    Page<CompanySaleServerListVO> selectPage(CompanySaleServerQuery companySaleServerQuery, String siteId);


    /**
     * 根据用工单位服务id查找
     *
     * @param companySaleServerId 用工单位服务id
     * @param siteId              所属站点id
     * @return 用工单位服务
     */
    CompanySaleServerDO selectDOById(String companySaleServerId, String siteId);

    /**
     * 查询用工单位服务
     *
     * @param companySaleServerQuery 查询条件
     * @param siteId                 所属站点id
     * @return 用工单位服务列表
     */
    List<CompanySaleServerDO> selectDO(CompanySaleServerQuery companySaleServerQuery, String siteId);

    /**
     * 查询用工单位下的服务列表
     *
     * @param companyId 用工单位Id
     * @param siteId    站点
     * @return 服务列表
     */
    List<CompanySaleServerDO> selectCompanyServerList(String companyId, String siteId);

    /**
     * 查询对应所有用工单位下的服务列表
     *
     * @param companyIdList 用工单位id列表
     * @param siteId        站点
     * @return 服务列表
     */
    List<CompanySaleServerDO> selectByCompanyIdList(List<String> companyIdList, String siteId);

    /**
     * 批量保存
     *
     * @param companySaleServerList 保存列表
     * @param tokenUser             当前用户
     * @return 保存结果
     */
    List<CompanySaleServerDO> bachSave(List<CompanySaleServerAddDTO> companySaleServerList, TokenUser tokenUser);

    /**
     * 写入定时任务
     *
     * @param serverList 服务列表
     * @param companyId  用工单位Id
     * @param tokenUser  当前用户
     */
    void addServetTask(List<CompanySaleServerDO> serverList, String companyId, TokenUser tokenUser);

    /**
     * 删除对应用工单位服务列表
     *
     * @param companyId 用工单位Id
     * @param tokenUser 当前用户
     */
    void deleteFromCompany(String companyId, TokenUser tokenUser);

    /**
     * 保存服务列表时校验时间段是否有重叠
     *
     * @param companySaleServerList 服务列表
     */
    void checkServerTime(List<CompanySaleServerAddDTO> companySaleServerList);

    /**
     * 判断用工单位是否处于合同有效期内,
     * 没有设置过合同有效期：返true,在有效期内
     * 设置过多条合同，只要有一条时间区间包含当前时间，就返回true,在有效期内
     * 其他场景，返回false,处于有效期外
     * @param companyId
     * @param tokenUser
     * @return
     */
    Boolean findContractStatus(String companyId, TokenUser tokenUser);
}


